/*!
 * Node-data module v1.0.0 of jRaiser javascript library
 * http://code.google.com/p/jraiser/
 *
 * Author: Heero.Luo
 * Licensed under MIT license
 *
 * Date: Tue Jun 05 2012 10:36:40 GMT+0800
 */
define(function(require, exports, module) { 'use strict';

var core = require('core/1.0.x/core'), $base = require('node-base/1.0.x/node-base');
var uniqueId = $base.uniqueId;


// 存放自定义节点数据
var nodeData = { };

/**
 * 获取节点自定义数据
 * @param {DOMElement} 节点
 * @param {String} 数据名
 * @return {Mixed} 数据值
 */
function getData(node, key) {
	var id = uniqueId(node);
	return nodeData.hasOwnProperty(id) ? nodeData[id][key] : null;
}

/**
 * 设置节点自定义数据
 * @param {DOMElement} 节点
 * @param {String} 数据名
 * @param {Mixed} 数据值
 */
function setData(node, key, val) {
	var id = uniqueId(node), data = nodeData[id] = nodeData[id] || { };
	data[key] = val;
}

/**
 * 移除节点自定义数据
 * @param {DOMElement} 节点
 * @param {String|Array} 数据名，如果为空，则移除所有自定义数据；
 *                       多个数据名用空格隔开，或者以数组形式传入
 * @param {Boolean} 此参数主要用于循环调用时，忽略对数据名的重复解析
 */
function removeData(node, key, isPass) {
	var id = uniqueId(node);
	if (key == null || key === '') {
		delete nodeData[id];
	} else {
		var data = nodeData[id];
		if (data) {
			if (!isPass) { key = $base.splitBySpace(key); }
			key.forEach(function(k) {
				delete data[k];
			});
		}
	}
}


core.extend(exports, {
	/**
	 * See line 19
	 */
	getData : getData,
	
	/**
	 * See line 30
	 */
	setData : setData,
	
	/**
	 * See line 41
	 */
	removeData : removeData,

	/**
	 * node模块的扩展接口
	 */
	nodeApis : {
		/**
		 * 获取当前节点集合中第一个节点的自定义数据
		 * @param {String} 数据名
		 * @return {Mixed} 数据值
		 */
		/**
		 * 设置当前所有节点的自定义数据
		 * @param {String|Object} 数据名
		 * @param {Mixed} 数据值
		 * @return {NodeList} 当前节点集合
		 */
		data : function(key, val) {
			return core.access(this, key, val, true, {
				get : getData,
				set : setData
			});
		},
		
		/**
		 * 移除当前节点集合中所有节点的自定义数据
		 * @param {String} 数据名，如果为空，则移除所有自定义数据；
		 *                 多个数据名用空格隔开，或者以数组形式传入
		 * @return {NodeList} 当前节点集合
		 */
		removeData : function(key) {
			key = $base.splitBySpace(key);
			
			this.forEach(function(elt) {
				removeData(elt, key, true);
			});
			
			return this;
		}
	}
});

});